﻿Imports System.Security.Principal

''' <summary>
''' 外部のセキュリティ プリンシパルを表すクラスです。
''' </summary>
''' <remarks></remarks>
Public NotInheritable Class ForeignSecurityPrincipal
  Inherits DomainObject

#Region " プライベートフィールド "
  Private ReadOnly _readableName, _displayName As String
#End Region

#Region " フレンドコンストラクター "
  ''' <summary>
  ''' <see cref="DirectoryEntry"/> を指定して <see cref="ForeignSecurityPrincipal"/> クラスの新しいインスタンスを初期化します。
  ''' </summary>
  ''' <param name="entry"><see cref="DirectoryEntry"/>。</param>
  ''' <remarks></remarks>
  Friend Sub New(entry As DirectoryEntry)
    MyBase.New(entry)

    Dim objectSid = DirectCast(entry.Properties.Item("objectSid").Value, Byte())
    Dim sid = New SecurityIdentifier(objectSid, 0)  'SID
    Dim account = DirectCast(sid.Translate(GetType(NTAccount)), NTAccount)  'アカウントに変換
    _readableName = account.Value   'NT AUTHORITY\○○ => ToStringメソッドでも同じ
    _displayName = IO.Path.GetFileName(account.Value)   'NT AUTHORITY\○○ の ○○部分
  End Sub
#End Region

#Region " パブリックプロパティ "
  ''' <summary>
  ''' 表示用の名前を取得します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>表示用の名前。</returns>
  ''' <remarks></remarks>
  Public ReadOnly Property DisplayName As String
    Get
      Return _displayName
    End Get
  End Property

  ''' <summary>
  ''' 読み取り可能な名前を取得します。
  ''' </summary>
  ''' <value></value>
  ''' <returns>読み取り可能な名前。</returns>
  ''' <remarks></remarks>
  Public ReadOnly Property ReadableName As String
    Get
      Return _readableName
    End Get
  End Property
#End Region

#Region " パブリックメソッド "
  ''' <summary>
  ''' 表示用の名前を返します。
  ''' </summary>
  ''' <returns>表示用の名前。</returns>
  ''' <remarks></remarks>
  Public Overrides Function ToString() As String
    Return Me.DisplayName
  End Function
#End Region
End Class
